AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi [Andorra] Scrollen per Mausbewegung+Rechtsklick
Thema durchsuchen
Ansicht
Themen-Optionen

[Andorra] Scrollen per Mausbewegung+Rechtsklick

Ein Thema von Codewalker · begonnen am 26. Jun 2008
Antwort Antwort
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#1

[Andorra] Scrollen per Mausbewegung+Rechtsklick

  Alt 26. Jun 2008, 15:41
Ich vielen Strategiespielen ist es ja so, dass man nicht nur an den Bildschirmrändern über die Landschaft scrollen kann, sondern (seit Z von den Bitmap Brothers) auch die rechte Maustaste gedrückt halten kann und das Scrolling folgt der Mausbewegung. Ich wollte das ganze mit Andorra umsetzen und das Ergebnis sieht dann so aus:

Delphi-Quellcode:
VScroll: TPoint;
TInputState = (isRightClickScroll);
TInputStates = set of TInputState;
{....} 


procedure TEngine.Mousedown(Button: TMouseButton; Shift: TShiftState; X, Y: integer);
var
  pt: TPoint;
begin
  if Button = mbRight then // Nur bei rechter Maustaste
  begin
    InputState := InputState + [isRightClickScroll]; // Merken, dass Rechtklick-Scrolling an ist

    pt := Point(AParent.ClientOrigin.X+AParent.ClientWidth div 2,AParent.ClientOrigin.Y+AParent.ClientHeight div 2);
    SetCursorPos(pt.X, pt.Y); // Cursor auf Mitte zentrieren
  end;
end;

procedure TEngine.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer);
begin
  if Button = mbRight then
  begin
    InputState := InputState - [isRightClickScroll]; // Merken, dass Rechtklick-Scrolling aus ist
    VScroll := Point(0, 0); // Scrollingversatz zurücksetzen
  end;
end;

procedure TEngine.MouseMove(X, Y: integer);
  Center, RealPoint: TPoint;
begin
  if isRightClickScroll in InputState then
  begin
  // Mitte ermitteln
    Center := Point(AParent.ClientOrigin.X+AParent.ClientWidth div 2,AParent.ClientOrigin.Y+AParent.ClientHeight div 2);
// Tatsächliche Mausposition ermitteln
    RealPoint := Point(AParent.ClientOrigin.X+X,AParent.ClientOrigin.Y+Y);
// Anstand in "Vektor" speichern (hier TPoint zweckentfremdet
    VScroll.x := VScroll.X + (Center.X - RealPoint.X);
    VScroll.y := VScroll.Y + (Center.Y - RealPoint.Y);
  end;

procedure TEngine.DoScroll(TimeGap: double);
var
  Center: TPoint;
begin
  if isRightClickScroll in InputState then
    if (VScroll.X <> 0) or (VScroll.Y <> 0) then // Nur ausführen, wenn auch Versatz da ist
    begin
   // Entsprechend des Versatzes scrollen
      SpriteEngine.X := SpriteEngine.X + VScroll.X;
      SpriteEngine.Y := SpriteEngine.Y + VScroll.y;
   // Es wurde gescrollt, also Vektor zurücksetzen
      VScroll.x := 0;
      VScroll.Y := 0;
   // Cursor wieder auf Mitte festhalten
      Center:=Point(AParent.ClientOrigin.X+AParent.ClientWidth div 2,AParent.ClientOrigin.Y+AParent.ClientHeight div 2);
      SetCursorPos(Center.X, Center.Y);
      Exit;
    end;
end;
Neben viel drum herum ist die Hauptaufgabe, die Maus immer wieder auf den Fenstermittelpunkt zu zentrieren und im MouseMove auf Mausbewegungen zu reagieren. Dort wird dann nur der Versatz vom Mittelpunkt aus gespeichert, der Mauszeiger zurückgesetzt und beim nächsten Zeichnen der Landschaft das Scrolling angewandt (und der Vektor für den Versatz wieder auf 0,0 zurückgesetzt)

Edit: Die Verwendung des Sets ist dadurch bedingt, dass ich das aus einem größeren Spielprojekt herausgelöst habe. Hier natürlich auch eine Boolean-Variable reichen
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz